package com.sddr.config.event;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.sddr.base.frame.metadata.MetaDataOperation;
import com.sddr.common.entity.ConfigRule;
import com.sddr.config.operation.RemoteConfigRuleOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;


/**
 * @author 山顶洞人郑某
 * @className ConfigEventHandler.java 读取配置中心事件接收者
 * @date 2025 07 13
 */
@AllArgsConstructor
@Slf4j
public class ConfigEventHandler implements ApplicationListener<ConfigEvent> {

    /**
     * 元数据操作接口
     */
    private final MetaDataOperation metaDataOperation;
    /**
     * 配置中心操作接口
     */

    private final RemoteConfigRuleOperation remoteConfigRuleOperation;
    /**
     * 监听事件
     * @param event 读取配置中心事件
     */
    @Override
    public void onApplicationEvent(final ConfigEvent event) {
        //从配置中心读取配置信息
        getConfig();
        //监听配置中心
        remoteConfigRuleOperation.linstenConfig();
    }

    /**
     * 获取配置信息
     */
    public void getConfig() {
        log.info("----Link-Folow ----获取配置----");
        //读取全局配置
        String remoteGeneralConfig = getRemoteConfig(true);
        if (!StrUtil.isEmpty(remoteGeneralConfig)) {
            log.info("获取全局配置成功,{}",remoteGeneralConfig);
            //存到内存中
            metaDataOperation.setRule(JSONObject.parseObject(remoteGeneralConfig, ConfigRule.class));
        }
        //读取自己的配置
        String remoteConfig = getRemoteConfig(false);
        if (!StrUtil.isEmpty(remoteConfig)) {
            log.info("获取服务配置成功,{}",remoteConfig);
            //存到内存中
            metaDataOperation.setRule(JSONObject.parseObject(remoteConfig, ConfigRule.class));
        }
    }

    /**
     * 获取远程配置中心配置信息
     * @param generalConfig
     * @return
     */
    public String getRemoteConfig(Boolean generalConfig) {
        try
        {
            return remoteConfigRuleOperation.getConfig(generalConfig);
        } catch (Exception e) {
            log.error("获取远程配置中心配置信息异常", e);
        }
        return null;
    }
}
